package com.leetcode;

import com.leetcode.common.TreeNode;

/**
 * 101. 对称二叉树
 * 翻转其中一颗子树之后如果和原树相同，则是对称的树
 *
 * @author fy
 * @date 2022-04-17 18:22
 */
public class Solution101 {

    public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }
        if (root.left == null && root.right == null) {
            return true;
        }
        if (root.left == null || root.right == null) {
            return false;
        }
        if (root.left.val != root.right.val) {
            return false;
        }

        // 翻转之后如果和原树相同，则是对称的树
        return isSameTree(root.left, invertTree(root.right));
    }

    private TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }

        invertTree(root.left);
        invertTree(root.right);

        TreeNode left = root.left;
        root.left = root.right;
        root.right = left;

        return root;
    }

    private boolean isSameTree(TreeNode p, TreeNode q) {
        // 如果两个二叉树都为空，则两个二叉树相同
        if (p == null && q == null) {
            return true;
        }
        // 如果两个二叉树中有且只有一个为空，则两个二叉树一定不相同
        if (p == null || q == null) {
            return false;
        }
        // 如果两个二叉树都不为空，那么首先判断它们的根节点的值是否相同，若不相同则两个二叉树一定不同
        if (p.val != q.val) {
            return false;
        }
        // 若相同，再分别判断两个二叉树的左子树是否相同以及右子树是否相同
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }

}
